perm filename MPRO[AI,JMC] blob
sn#005443 filedate 1971-08-13 generic text, type T, neo UTF8
TITLE MPRO
;MOVE PROPOSERS FIRST VERSION
ORDMV: TRNN FL,TIMR
JRST NOTOD
AOS MPCTR
MOVEI T1,0
CALLI T1,31
CONI 730,SVMMPT#
NOTOD: TRZ FL,FGMF+AFGM ;NOT IN FORCED GAME
MOVE T1,LEVEL ;GET CURRENT LEVEL
CAML T1,ENDLV ;HAVE WE GONE FAR ENOUGH
TRO FL,FGMF ;SET FLAG
ADDI T1,1
CAML T1,ENDLV
TRO FL,AFGM
SETZM FGCNT#
PUSHJ P,VULNC
MOVE I,ULIM ;GET START OF POSSIBLE MOVES
EVME: CAMG I,LLIM ;FAR ENOUGH?
JRST ENDORD ;YES, FINISH UP
MOVE MOVER,(I) ;GET MOVE
TRNE FL,FGMF ;IN FORCED GAME?
PUSHJ P,FGMR ;YES, EVALUATE
PUSHJ P,EVR1 ;NO, USE OTHER EVALUATOR
PUSHJ P,FILL ;PUT MOVE INTO PROPER ORDER
SOJA I,EVME ;NEXT MOVE
;THE VALUE GENERATOR
EVR1: MOVEI CNT,0 ;STARTING VALUE IS ENOUGH SO POS
TRNE MOVER,EPSET ;CHECK FOR VALID PROMBT
JRST NCAP ;NO VALID
TRNE MOVER,PROMBT ;IS THERE A PROMOTION
ADD CNT,PROMVL ;ADD PROMOTION VALUE
TRNN MOVER,CAPBT ;IS IT A CAPTURE
JRST NCAP ;NO
TRNE MOVER,EPCAP ;IS IT EP
JRST ISEPC ;YES, SPECIAL HANDELING
LDB T1,[POINT 6,MOVER,35] ;GET DEST
SKIPA T1,OCC(T1) ;WHO IS IT
ISEPC: MOVE T1,EPMOVER ;GET CORRECT PIECE
SKIPGE VULTBL(T1) ;VULNERABLE?
JRST NCAP
CPGIN: MOVE T1,KIND(T1) ;ADD IN VALUE
ADD CNT,VALUE(T1)
ADD CNT,CPVL ;YES, ADD IN VALUE
LDB T1,[POINT 5,MOVER,29]
MOVE T1,KIND(T1)
ADD CNT,VL2(T1) ;FAVOR CAPTURE WITH LESS VALUABLE
SOS FGCNT
NCAP: MOVEM CNT,SVCNT# ;SAVE VALUE
;TIM@ OUT TO DEFINE A MACRO
DEFINE SAVE (A)
<IRP A <PUSH P,A>>
SAVE <MOVER,I>
TRNN FL,TIMR
JRST NOTOD1
AOS MPPCTR
PUSH P,SVMMPT
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
MOVE T1,TMPUT
MOVEM T1,STMPUT#
NOTOD1: JSR GOMOV
TRNN FL,TIMR
JRST NOTOD2
MOVE T1,TMPUT
SUB T1,STMPUT
ADDM T1,TMMP
ADDM T1,TMPMP
MOVEI T1,0
CALLI T1,31
CONI 730,SVMMPT
NOTOD2: MOVE CNT,SVCNT ;RETRIEVE COUNT
OCKGIN: PUSHJ P,VULNC2 ;NOW DO CALCS AGAIN
MOVE T1,COLOR ;WHAT COLOR MOVED
IORI T1,4 ;SEE IF IN CHECK
PUSHJ P,CAT ;GO LOOK
SKIPLE NATRS ;HOW MANY?
JRST INCK ;WE ARE IN CHECK, BAD MOVE
XORI T1,20 ;HOW ABOUT HIM?
PUSHJ P,CAT
SKIPG T2,NATRS ;ANY ATTACKERS
JRST NOCKS ;NO, NOT IN CHECK
CAIG T2,1 ;ONE OR MORE?
JRST CKSE1 ;ONLY ONE, CHECK FOR SAFE CHECK
ADD CNT,DCKVL ;ADD VALUE FOR DOUBLE CHECK
SOS FGCNT
JRST NOCKS ;AND GO ON
CKSE1: MOVE T1,ATKRS ;GET THE CHECKR
SKIPL VULT2(T1) ;VULNERABLE?
JRST NOCKS ;YES
ADD CNT,SCKVL ;NO, CREDIT MOVE
REPEAT 0,<NOCKS: HRLZI T1,-20 ;SEE IF ANSWERS THREAT
HRR T1,COLOR ;LOOK AT OUR PIECES
CKANS: SKIPGE VULTBL(T1) ;WAS IT VULNERABLE
JRST NOAST ;NO, DOES NOT ANSWER THREAT
SKIPL VULT2(T1) ;IS HE NOW?
JRST NOAST ;YES, NO HELP HERE
ADD CNT,ATHVL ;NO, MOVE ANSWERS THREAT
JRST CKTH ;NOW TRY NEXT REASON FOR GOOD MOVE
NOAST: AOBJN T1,CKANS ;TRY ANOTHER PIECE
CKTH: TRZ FL,DTHCK ;ZERO THE DOUBLE THREAT FLAG
HRLZI T1,-20 ;20 PIECES
HRR T1,COLOR ;GET COLOR
XORI T1,20 ;LOOK AT HIS PIECES
CKTHL: SKIPL VULTBL(T1) ;WAS IT VULNERABLE
JRST NOTH ;YES, FORGIP IT
SKIPGE VULT2(T1) ;IS HE NOW?
JRST NOTH ;NO, GO ON
TROE FL,DTHCK ;SINGLE OR DOUBLE?
JRST DBLVL ;DOUBLE, OH BOY, OH BOY!
ADD CNT,THRVL ;ONLY SINGLE
NOTH: AOBJN T1,CKTHL ;TRY FOR DOUBLE
SKIPA
DBLVL: ADD CNT,DTHRVL ;YES, DOUBLE THREAT
HRLZI T1,-20 ;SEE IF WE HAVE LET A NEW THREAT DEVELOP
HRR T1,COLOR
CKNTH: SKIPL VULTBL(T1)
JRST NONTH
SKIPL VULT2(T1)
JRST SBNTV ;YES, GO FIX CNT
NONTH: AOBJN T1,CKNTH
SKIPA
SBNTV: SUB CNT,NTHRT ;BAD MOVE
ANDI T1,37 ;NOW LOOK AT HIS PIECES
HRLZI T1,-20
CKLOS: SKIPGE VULTBL(T1) ;HAS A THREAT TO HIM GONE AWAY
JRST NOLOS
SKIPGE VULT2(T1)
JRST SBLOS ;YES
NOLOS: AOBJN T1,CKLOS
SKIPA
SBLOS: SUB CNT,LOSV ;BAD MOVE
>
NOCKS: HRLZI T1,-20
HRR T1,COLOR
CKTH1: ADD CNT,VULTBL(T1)
SUB CNT,VULT2(T1)
AOBJN T1,CKTH1
HRLZI T1,-20
HRR T1,COLOR
XORI T1,20
CKTH2: ADD CNT,VULT2(T1)
SUB CNT,VULTBL(T1)
AOBJN T1,CKTH2
MOVEM CNT,SVCNT ;THATS ALL FOR NOW
TRNN FL,TIMR
JRST NOTOD3
AOS MPPCTR
PUSH P,SVMMPT
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
MOVE T1,TMPUT
MOVEM T1,STMPUT
NOTOD3: JSR UNMOV ;RETRACT
TRNN FL,TIMR
JRST NOTOD4
MOVE T1,TMPUT
SUB T1,STMPUT
ADDM T1,TMMP
ADDM T1,TMPMP
MOVEI T1,0
CALLI T1,31
CONI 730,SVMMPT
;ANOTHER MACRO
DEFINE UNSAVE (A)
<IRP A <POP P,A>>
NOTOD4: UNSAVE <I,MOVER>
MOVE CNT,SVCNT
ADD CNT,POSMK
POPJ P,
;ROUTINE TO PUT MOVES IN PROPER ORDER
FILL: TRNN FL,TIMR
JRST NOSEC
AOS FCTR
PUSH P,SVMMPT
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
MOVEI T1,0
CALLI T1,31
CONI 730,SVFIL#
NOSEC: MOVE J,ULIM ;ST@RT SEARCH FOR CORRECT PLACE
INSLP: CAMN J,I ;AT END OF SEARCH?
JRST INBLT ;YES, INSERT
HLRE T1,(J) ;GET VALUE OF THAT MOVE
CAML T1,CNT ;INSERT HERE?
SOJA J,INSLP ;NO, TRY NEXT
INBLT: MOVSS CNT ;PUT IN LEFT HALF
HRR CNT,(I) ;GET PROPER MOVE
HRLI T1,1(I) ;SET UP BLT
HRR T1,I
BLT T1,(J) ;BLT IT
MOVEM CNT,(J) ;PUT IN MOVE
TRNN FL,TIMR
POPJ P,
PUSH P,SVFIL
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
ADDM T1,FTMR
MOVEI T1,0
CALLI T1,31
CONI 730,SVMMPT
POPJ P, ;AND RETURN
;HERE IF IN CHECK
INCK: SKIPE CNT
AOS FGCNT
JSR UNMOV ;RETRACT MOVE
UNSAVE <I,MOVER>
MOVNI CNT,1 ;CNT IS -1 FOR THIS MOVE
POPJ P, ;RETURN
;THE END OF ORDERING
ENDORD: MOVE T1,LLIM ;YES
ELCK: CAMN T1,ULIM ;ELIMINATE CHECKS
JRST ENDAL3 ;ALL DONE IF SO
HLRE T2,1(T1)
JUMPG T2,ECK1
SKIPGE T2
AOS LLIM2
AOJA T1,ELCK ;YES, TRY NEXT ONE BACK
ECK1: TRNE FL,FGMF
JRST NOSHRT
MOVE T2,LEVEL
MOVN T2,NMV(T2)
CAMLE T2,FGCNT
MOVE T2,FGCNT
ADD T2,ULIM
CAMLE T2,T1
MOVE T1,T2
NOSHRT: PUSH P,T1 ;SAVE POINTER
SETZM UP# ;ZERO COUNTERS
SETZM DOWN#
SKIPA
KPSM: AOS UP ;INDEX UP COUNTER
CAMN T1,LLIM ;ARE ALL INCLUDED?
JRST ENDAL ;YES, MUST BE DONE
HLRZ T2,(T1) ;GET VALUE
HLRZ T3,1(T1) ;AND OF PREVIOUS
CAMN T2,T3 ;SAME?
SOJA T1,KPSM ;KEEP IT ANYWAY
ENDAL: PUSH P,T1 ;SAVE NEW VALUE
MOVE T1,-1(P) ;GET BACK OLD VALUE
KPSM2: HLRZ T2,(T1) ;GET VALUE
HLRZ T3,1(T1) ;SAME?
CAME T2,T3
JRST ENDAL2
AOS DOWN ;INCLUDE FEWER
ADDI T1,1
CAME T1,ULIM ;REACHED LIMIT?
JRST KPSM2 ;NO
ENDAL2: EXCH T1,-1(P) ;GET ORIGINAL
MOVE T2,DOWN ;GET DOWN COUNT
CAIG T2,2 ;IS IT 2 OR FEWER
MOVE T1,-1(P) ;IF SO LOOK AT FEWER
MOVE T2,UP ;NOW SAME FOR UP
CAIG T2,2
MOVE T1,(P)
SUB P,[XWD 2,2] ;SYNC STACK
ENDAL3: MOVEM T1,LLIM ;THATS IT
TRNN FL,TIMR
JRST NOTOD9
PUSH P,SVMMPT
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
NOTOD9: POPJ P, ;RETURN
;SUBROUTINES USED BY ABOVE
VULNC: TRNN FL,TIMR
JRST NOSEC2
AOS VCTR
PUSH P,SVMMPT
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
MOVEI T1,0
CALLI T1,31
CONI 730,SVVNC#
NOSEC2: SETOM VULTBL ;DO VULNERABLE CALC ON ALL PIECES
MOVE T1,[XWD VULTBL,VULTBL+1] ;ZERO TABLE
BLT T1,VULTBL+37
HRLZI T1,-40
PUSHJ P,VULC
MOVEM T3,VULTBL(T1) ;YES, SET VUL VALUE
AOBJN T1,.-2 ;NEXT PIECE
SETOM VULTBL+4
SETOM VULTBL+24
TRNN FL,TIMR
POPJ P,
PUSH P,SVVNC
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
ADDM T1,VTMR
MOVEI T1,0
CALLI T1,31
CONI 730,SVMMPT
POPJ P, ;DONE
VULNC2: TRNN FL,TIMR
JRST NOSEC3
AOS V2CTR
PUSH P,SVMMPT
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
MOVEI T1,0
CALLI T1,31
CONI 730,SVVNC2#
NOSEC3: SETOM VULT2 ;SIMILAR TO ABOVE
MOVE T1,[XWD VULT2,VULT2+1]
BLT T1,VULT2+37
HRLZI T1,-40
PUSHJ P,VULC
MOVEM T3,VULT2(T1)
AOBJN T1,.-2
SETOM VULT2+4
SETOM VULT2+24
TRNN FL,TIMR
POPJ P,
PUSH P,SVVNC2
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
ADDM T1,V2TMR
MOVEI T1,0
CALLI T1,31
CONI 730,SVMMPT
POPJ P,
VULC: PUSHJ P,CAT ;CHECK ATTACKS
SKIPN T3,NATRS ;ATTACKERS?
JRST CPOPJ1 ;NO, NOT VULNERABLE
MOVEI T4,-1 ;FIND LEAST VALUABLE ATACKERS
MOVEI T5,-1
FLVAT: MOVE T6,ATKRS-1(T3) ;GET ATACKER
MOVE T6,KIND(T6) ;GET KIND
MOVE T6,VALUE(T6) ;AND VALUE
CAMG T4,T6 ;MORE VALUABLE
JRST NTAT ;TRY NEXT
MOVE T4,T6 ;SHIFT ATACKERS
CAMG T4,T5
EXCH T4,T5 ;KEEP T4 THE LARGER
NTAT: SOJG T3,FLVAT ;TRY NEXT
MOVE T3,NDEF ;NOW SIMILAR FOR DEF@NDERS
MOVEI T2,-1
FLVDF: MOVE T6,DEFRS-1(T3)
MOVE T6,KIND(T6)
MOVE T6,VALUE(T6)
CAMLE T2,T6
MOVE T2,T6
SOJG T3,FLVDF
MOVE T3,KIND(T1) ;GET VALUE
MOVE T3,VALUE(T3)
SKIPN NDEF ;CHECK FOR DEFNEDERS
POPJ P, ;VALUE IS PIECE
SOSE NATRS ;ONE OR MORE?
JRST ATK2S ;ONLY 1
SUB T3,T5 ;VALUE IS PC-ATKR
JUMPL T3,CPOPJ1 ;NOT, VULN IF NED
POPJ P,
ATK2S: SOSE NDEF ;HOW MANY DEFNEDERS
JRST DEF2 ;AT LEAST 2
CAMLE T2,T5 ;IF DEF MORE VAL THAN ATK THE VALUE IS PC
POPJ P,
ADD T3,T2
SUB T3,T5 ;VALUE IS PC+DEF-ATKR
JUMPL T3,CPOPJ1
POPJ P,
DEF2: MOVE T6,T5
ADD T5,T4
CAMLE T2,T5 ;IF DEF MOR VAL THEN BOTH ATKRS THEN PC
POPJ P,
SUB T3,T6
CAML T4,T2 ;IF ATK2 MORE VAL THAN DEF THEN PC-ATKR1
JRST DEF3
ADD T3,T2
SUB T3,T4 ;PC+DEF-ATK1-ATK2 IS VALUE
DEF3: SKIPGE T3
CPOPJ1: AOS(P) ;NOT VUL
POPJ P,
CAT: SETZM NDEF#
SETZM NATRS# ;CLEAR NUMBER OF DEENDERSAND ATACKERS
SKIPGE T2,LOC(T1) ;IS IT ON THE BOARD
POPJ P, ;NO ATACKS, DO DEFENSES
HRLI T2,-20 ;20 DIRECTIONS
BRLP: SKIPGE T3,JBEAR(T2) ;ANYONE BEARING ON IT
JRST NOBR ;NO
TLNE T3,300000 ;PSEUDO?
JRST NOBR
MOVE T4,T3 ;YES, CHECK COLOR
XOR T4,T1
TRNE T4,20 ;SAME?
JRST ATK ;NO, AN ATTACK
AOS T4,NDEF ;YES, A DEFENSE
MOVEM T3,DEFRS-1(T4) ;SAVE
JRST NOBR
ATK: AOS T4,NATRS ;SAME FOR ATTACK
MOVEM T3,ATKRS-1(T4)
NOBR: ADDI T2,77 ;DIRECION INCREMENT IS ADD 100
AOBJN T2,BRLP ;NEXT ONE
POPJ P, ;DONE
;THE FORCED GAME ROUTINE
FGMR: AOS (P) ;SEE CALL
MOVEI CNT,0
REPEAT 0,< MOVE T1,WCOUNT ;GIVE UP IF VALUE IS LESS THAN ALPHA
SUB T1,BCOUNT
LSH T1,1
SKIPE COLOR
MOVNS T1 ;GOT VALUE
CAMGE T1,ALPHA
POPJ P,
>
TRNN MOVER,EPSET ;INVALID IF THIS IS ON
TRNN MOVER,CAPBT ;A CAPTURE?
JRST NCAPF
TRNE MOVER,EPCAP ;IS IT EP
JRST ISEP2
LDB T1,[POINT 6,MOVER,35] ;GET DEST
SKIPA T1,OCC(T1) ;GET OCC
ISEP2: MOVE T1,EPMOVER ;FOR EP CAPTURES
PUSHJ P,VULC ;CHECK VULNERABLE
JRST CPGIN ;GOOD ENOUGH
NCAPF: TRZ FL,INCKF ;ARE WE IN CHECK
PUSHJ P,CKCK
TRO FL,INCKF ;YES, ANYTHING GETS US OUT IS GOOD
MOVEM CNT,SVCNT ;SAVE THE V↓LUE
SAVE <MOVER,I>
TRNN FL,TIMR
JRST NOTOD5
AOS MPPCTR
PUSH P,SVMMPT
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
MOVE T1,TMPUT
MOVEM T1,STMPUT
NOTOD5: JSR GOMOV ;MAKE THE MOVE
TRNN FL,TIMR
JRST NOTOD6
MOVE T1,TMPUT
SUB T1,STMPUT
ADDM T1,TMMP
ADDM T1,TMPMP
MOVEI T1,0
CALLI T1,31
CONI 730,SVMMPT
NOTOD6: MOVE CNT,SVCNT
PUSHJ P,CKCK ;IN CHECK?
JRST INCK ;YES, SAME ROUTINE SINCE EXIT ALREADY INCREMENTED
TRZE FL,INCKF ;WERE WE IN CHECK
JRST OCKGIN ;EVALUATE
SKIPG CKLEV ;CHECKS STILL GOOD?
JRST NOCKC ;NO, GO ON
MOVEI T1,4 ;TRY HIS KING
IOR T1,COLOR
XORI T1,20
PUSHJ P,CAT ;CHECK ATTACKS
SKIPG T2,NATRS ;HOW MANY?
JRST NOCKC ;NONE
SOJG T2,OCKGIN ;IF MORE THAN 1 GOOD, EVALUATE
MOVE T1,ATKRS ;WHO IS IT
PUSHJ P,VULC ;VULNERABLE?
JRST NOCKC ;YES, FORGET IT
JRST OCKGIN ;GO EVALUATE
NOCKC: MOVEM CNT,SVCNT ;RETRACT MOVE
TRNN FL,TIMR
JRST NOTOD7
AOS MPPCTR
PUSH P,SVMMPT
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMMP
MOVE T1,TMPUT
MOVEM T1,STMPUT
NOTOD7: JSR UNMOV
TRNN FL,TIMR
JRST NOTOD8
MOVE T1,TMPUT
SUB T1,STMPUT
ADDM T1,TMMP
ADDM T1,TMPMP
MOVEI T1,0
CALLI T1,31
CONI 730,SVMMPT
NOTOD8: UNSAVE <I,MOVER>
MOVE CNT,SVCNT
POPJ P, ;AND RETURN
;THE EVALUATOR
EVALIT: PUSHJ P,CKCK ;IN CHECK?
JRST RETMI ;VERY BAD
MOVE T1,WCOUNT
SUB T1,BCOUNT ;GET DIFFERENCE
LSH T1,1 ;*2 FOR FRACTIONAL ALPHA-BETA
SKIPE COLOR ;WHO IS IT?
MOVNS T1 ;INVERT IF BLACK
POPJ P,
RETMI: HRLZI T1,500000 ;VERY BAD MOVE
POPJ P,
INTERNAL ORDMV,EVALIT
INTERNAL ENDLV,PROMVL,CPVL,DCKVL,SCKVL,ATHVL,THRVL
INTERNAL DTHRVL,OUTCKL,POSMK,NMV
EXTERNAL LEVEL,ULIM,LLIM,OCC,EPMOVER,GOMOV,COLOR,UNMOV,LOC,JBEAR
EXTERNAL CKLEV,CKCK,WCOUNT,BCOUNT,KIND,VALUE,ALPHA,LLIM2
EXTERNAL TIMIT,TMMP,TMPMP,TMPUT,MPPCTR,MPCTR,FTMR,VTMR,V2TMR,VCTMR
EXTERNAL V2CTR,VCTR,FCTR
ENDLV: 4
PROMVL: 20
CPVL: 200
DCKVL: 200
SCKVL: 100
ATHVL: 4
THRVL: 2
DTHRVL: 10
OUTCKL: 200
LOSV: 2
NTHRT: 4
POSMK: 200
VL2: EXP 3,1,2,2,0,-1 ;VALUES FOR CAPTURING PIECE
VULTBL: BLOCK 40
VULT2: BLOCK 40
NMV: REPEAT 30,<EXP 10>
DEFRS: BLOCK 20
ATKRS: BLOCK 20
FGMF==200
AFGM==2000
DTHCK==400
INCKF==1000
TIMR==4000
EPSET==400000
EPCAP==10000
CAPBT==4000
PROMBT==200000
FL=0
P=17
MOVER=16
I=7
J=10
T1=1
T2=2
T3=3
T4=4
T5=5
T6=6
CNT=11
END